// src/services/ForumService.js

import apiClient from './api';

/**
 * @function getThreads
 * @description 获取帖子主题列表，支持分页、排序和搜索
 * @param {object} params - 查询参数 (由Vue组件的listQuery传入)
 * @returns {Promise<object>} - 返回一个适配前端的、包含总数和列表的对象 { total: number, list: Array<object> }
 */
export const getThreads = async (params) => {
  const apiParams = {
    pageNo: params.page,
    pageSize: params.pageSize,
    sortBy: params.sortBy, //reply_at回复量，created_at创建时间，last_reply_at最后回复时间
    searchKey: params.searchQuery,
  };
  const response = await apiClient.get('/api/threads', { params: apiParams });
  if (response.data && response.data.status === 0 && response.data.data) {
    return {
      total: response.data.data.total,
      list: response.data.data.threads,
    };
  } else {
    throw new Error(response.data.message || '获取帖子列表失败');
  }
};

/**
 * @function getThreadById
 * @description 获取单个帖子的详细信息及其回帖列表（分页）
 * @param {number} threadId - 帖子ID
 * @param {object} replyParams - 回帖的分页参数 { page: number, pageSize: number }
 * @returns {Promise<object>} - 返回适配前端组件的、包含帖子详情和回帖列表的对象
 */
export const getThreadById = async (threadId, replyParams) => {
  const apiParams = {
    pageNo: replyParams.page,
    pageSize: replyParams.pageSize,
  };
  const response = await apiClient.get(`/api/threads/${threadId}`, { params: apiParams });
  if (response.data && response.data.status === 0 && response.data.data) {
    const apiData = response.data.data;
    const formattedData = {
      threadDetails: {
        id: apiData.id,
        title: apiData.title,
        content: apiData.content,
        authorId: apiData.authorId,
        authorName: apiData.authorName,
        authorAvatar: apiData.authorAvatar,
        createdAt: apiData.createdAt,
      },
      replies: {
        total: apiData.repliesTotal,
        list: apiData.repliesList,
      }
    };
    return formattedData;
  } else {
    throw new Error(response.data.message || '获取帖子详情失败');
  }
};

/**
 * @function createThread
 * @description 创建一个新的帖子主题
 * @param {object} threadData - 新帖子的数据
 * @returns {Promise<object>} - 返回包含新帖子ID的对象，例如 { threadId: "4" }
 */
export const createThread = async (threadData) => {
  const response = await apiClient.post('/api/threads', threadData);
  if (response.data && response.data.status === 0) {
    return response.data.data;
  } else {
    throw new Error(response.data.message || '创建帖子失败');
  }
};

/**
 * @function createReply (无修改)
 * @description 在一个帖子下创建新的回帖
 * @param {number} threadId - 目标帖子的ID
 * @param {object} replyData - 回帖数据
 * @returns {Promise<object>} - 返回新创建的回帖对象
 */
export const createReply = async (threadId, replyData) => {
  const response = await apiClient.post(`/api/threads/${threadId}/replies`, replyData);
  if (response.data && response.data.status === 0) {
    return response.data.data;
  } else {
    throw new Error(response.data.message || '回复失败');
  }
};

/**
 * @function addThreadReadCount (新增函数)
 * @description 增加指定帖子的阅读量
 * @param {number} threadId - 帖子ID
 * @returns {Promise<void>}
 */
export const addThreadReadCount = async (threadId) => {
  try {
    // 根据后端定义，使用PUT方法，并发送一个空对象作为请求体
    await apiClient.put(`/api/threads/${threadId}/read`, {});
  } catch (error) {
    // 这个API调用失败通常不应阻塞用户查看帖子，所以我们在这里只打印错误，不向上抛出
    console.error(`增加阅读量失败 for threadId ${threadId}:`, error);
  }
};

/**
 * @function likeReply
 * @description 为指定的回帖点赞
 * @param {number | string} replyId - 回帖的ID
 * @returns {Promise<object>} - 返回后端响应中的 data 对象, e.g., { msg: "点赞成功" }
 */
export const likeReply = async (replyId) => {
  // 根据接口定义，我们使用 PUT 方法，并发送一个空对象作为请求体
  const response = await apiClient.put(`/api/threads/replies/${replyId}/thumbsup`, {});
  if (response.data && response.data.status === 0) {
    return response.data.data;
  } else {
    // 抛出错误，以便 Vue 组件中的 catch 块可以捕获
    throw new Error(response.data.message || '点赞操作失败');
  }
};

/**
 * @function dislikeReply
 * @description 为指定的回帖点踩
 * @param {number | string} replyId - 回帖的ID
 * @returns {Promise<object>} - 返回后端响应中的 data 对象, e.g., { msg: "点踩成功" }
 */
export const dislikeReply = async (replyId) => {
  // 注意：根据您给的接口信息，点踩的URL前缀可能也需要 /api/threads，这里我保持和点赞一致
  const response = await apiClient.put(`/api/threads/replies/${replyId}/thumbsdown`, {});
  if (response.data && response.data.status === 0) {
    return response.data.data;
  } else {
    throw new Error(response.data.message || '点踩操作失败');
  }
};


/**
 * @function deleteReply (新增函数)
 * @description 删除一个回帖
 * @param {number | string} replyId - 要删除的回帖的ID
 * @returns {Promise<object>} - 返回后端响应中的 data 对象, e.g., { msg: "已删除" }
 */
export const deleteReply = async (replyId) => {
  // 根据后端 @DeleteMapping 中有 @RequestBody 的定义，需要在此处传递一个空的 data 对象
  const response = await apiClient.delete(`/api/threads/replies/${replyId}`, {
    data: {} 
  });
  if (response.data && response.data.status === 0) {
    return response.data.data;
  } else {
    throw new Error(response.data.message || '删除回帖失败');
  }
};

/**
 * @function uploadImage
 * @description 上传图片文件到服务器
 * @param {File} file - 用户选择或粘贴的图片文件
 * @returns {Promise<string>} - 返回图片的URL
 */
export const uploadImage = async (file) => {
  const formData = new FormData();
  // 'file' 这个键必须和后端 @RequestParam("file") 注解中的值一致
  formData.append('file', file); 

  const response = await apiClient.post('/api/threads/image', formData, {
    // 当使用 FormData 时，浏览器会自动设置正确的 Content-Type (multipart/form-data)
    // 所以这里不需要手动设置 headers
    headers: {
      // 通过设置为 undefined，强制 Axios 删除可能存在的全局 Content-Type 设置
      // 这样浏览器就会接管并自动设置正确的 multipart/form-data 头
      'Content-Type': undefined 
    },

  });

  if (response.data && response.data.status === 0 && response.data.data.url) {
    return response.data.data.url;
  } else {
    throw new Error(response.data.message || '图片上传失败');
  }
};

/**
 * @function uploadFile (新增函数)
 * @description 上传通用文件到服务器
 * @param {File} file - 用户选择的任意类型文件
 * @returns {Promise<object>} - 返回包含文件信息的对象 { url, fileName, fileType }
 */
export const uploadFile = async (file) => {
  const formData = new FormData();
  formData.append('file', file);

  // 指向你新创建的后端接口
  const response = await apiClient.post('/api/threads/file', formData, {
    headers: {
      'Content-Type': 'multipart/form-data', // 使用 multipart/form-data
    },
  });

  if (response.data && response.data.status === 0 && response.data.data) {
    return response.data.data; // 返回 { url, fileName, fileType }
  } else {
    throw new Error(response.data.message || '文件上传失败');
  }
};
